<template>
  <div class="user">
    <h3>User页面</h3>
    <!-- 解耦前使用params -->
    <span>user: {{ $route.params.user }}</span>
    <!-- 解耦后使用params -->
    <span>解耦后user: {{ user }}</span>
    <br />
    <!-- 解耦后使用params -->
    <router-link :to="'/user/' + $route.params.user + '/login'"
      >去login</router-link
    >
    <br />
    <router-link :to="'/user/' + $route.params.user + '/reg'"
      >去reg</router-link
    >
    <br />
    <router-view />
  </div>
</template>

<script>
export default {
  data() {
    return {};
  },
  //【props $route解耦】--还需要在route.js中配置 props:
  //不定义props，访问user需要通过，$route.user，定义了props就可以像使用data一样使用params
  //定义了props好处是，可以不依赖$route，而直接使用params，解除了页面与$route的耦合
  props: ["user"],
  methods: {},
  created() {
    console.log("created");
  },
  mounted() {
    console.log("mounted");
    console.log(this.$route);
    console.log(this.$router);
  },
  //组件内的 导航守卫
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不！能！获取组件实例 `this`
    // 因为当守卫执行前，组件实例还没被创建
    console.log("User组件内部的导航守卫：beforeRouteEnter");
    next();
  },
  beforeRouteUpdate(to, from, next) {
    // 在当前路由改变，但是该组件被复用时调用
    // 举例来说，对于一个带有动态参数的路径 /foo/:id，在 /foo/1 和 /foo/2 之间跳转的时候，
    // 由于会渲染同样的 Foo 组件，因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
    console.log("User组件内部的导航守卫：beforeRouteUpdate");
    next();
  },
  beforeRouteLeave(to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
    console.log("User组件内部的导航守卫：beforeRouteLeave");
    next();
  }
};
</script>

<style scoped>
.user {
  border: dimgrey solid 1px;
}
</style>
